// Copyright (c) 2025, 大连理工大学 (Dalian University of Technology)
//
// Licensed under the Mulan PSL v2.
// You can use this file according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of the License at
//
//     http://license.coscl.org.cn/MulanPSL2
//
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. SEE THE MULAN PSL v2
// FOR MORE DETAILS.

/*
 * @Author: Wang Shuo wangshuo@sgsimulation.com
 * @Date: 2024-07-05 15:31:29
 * @LastEditors: wxc superjava@qq.com
 * @LastEditTime: 2024-09-29 17:00:06
 * @FilePath: /SGFEM/DBManager/src/Service/Input/Node/NodeService.cpp
 */
#include "DBManager/Service/Input/Node/NodeService.h"

#include <cassert>
#include <cstddef>
#include <vector>

#include "Utility/Algebra/Point.h"

#include "DataStructure/Common/Out.h"
#include "DataStructure/Input/Node/NodeData.h"

#include "DBManager/Common/ServiceMacro.h"
#include "DBManager/IRepository/Input/Node/INodeRepository.h"

using namespace SG::DBManager;
using namespace SG::DataStructure::FEM;

// 注册服务
SERVICE_REG_IMPL1 (NodeService, INodeRepository)

NodeService::NodeService (INodeRepository& repos) : m_repository (repos)
{}

NodeService::~NodeService () = default;

void NodeService::GetNodeCoord (const std::size_t index, SG::Algebra::Point& _OUT point)
{
    NodeData node;
    m_repository.FindByIndex (index, node);
    point.m_x = node.m_x[0];
    point.m_y = node.m_x[1];
    point.m_z = node.m_x[2];
}

void NodeService::GetNodeCoord (const std::vector<std::size_t>& indexes, std::vector<SG::Algebra::Point>& _OUT points)
{
    auto     nNode = indexes.size ();
    NodeData node;
    for (std::size_t i{ 0 }; i < nNode; ++i)
    {
        // ToDo 未来考虑局部坐标系下的节点
        auto posi = indexes[i];
        // assert (posi < GetRepository ().Size ());  // 节点下标不能越界

        m_repository.FindByIndex (posi, node);
        points[i].m_x = node.m_x[0];
        points[i].m_y = node.m_x[1];
        points[i].m_z = node.m_x[2];
    }
}
